home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / grafik / 3d & render tools / irit / contrib / cagd / srfgeom / surfcore.irt < prev   
Encoding:
Text File  |  1996-07-16  |  7.4 KB  |  268 lines

  1. #
  2. # Global demo objects attributes
  3. #
  4.  
  5. srfMainColor   = white;
  6. srfDomainColor = red;
  7. srfCurveColor  = yellow;
  8. srfUparColor   = magenta;
  9. srfVparColor   = green;
  10. srfNormColor   = cyan;
  11. srfCrvtrColor  = blue;
  12. crvTangColor   = yellow;   # tangent
  13. crvNormColor   = red;       # normal
  14. crvGCrvtrColor = cyan;      # geodesic osculating circle
  15. crvNCrvtrColor = blue;      # normal osculating circle
  16.  
  17. showSurfMain = true;
  18. showSurfDomain = true;
  19. showSurfHodo = true;
  20. showSurfDerivAtPoint = true;
  21. showSurfDerivAtHodo = true;
  22. showSurfCrvtr = true;
  23. showCurvDeriv = true;
  24. showCurvCrvtr = true;
  25.  
  26. hodoMat_ =  sc(0.5) * trans(vector(0, 0, 2));
  27.  
  28. #
  29. # Implementation functions
  30. #
  31.  
  32. normalize = FUNCTION(vec):
  33.     return = vec * (1.0 / sqrt(vec*vec));
  34.  
  35. SurfThumb = FUNCTION(pos):
  36.     return = sphereSrf(0.025)*trans(pos);
  37.  
  38. SurfOsculCircle = FUNCTION(vec, radius, nvec, dir):
  39.     return = circle(vector(0, 0, 0), radius)*
  40.         rotz2v2(nvec ^ dir, nvec)*
  41.         trans(vec+nvec*radius);
  42.  
  43. SurfOsculPlane = FUNCTION(vec, size, nvec, dir): 
  44.     return = poly(list(
  45.     vector(-size, -size, 0),
  46.     vector(-size, size, 0),
  47.     vector(size, size, 0),
  48.     vector(size, -size, 0)
  49.     ), false):
  50.     return = return * rotz2v2(nvec, dir) * trans(vec);
  51.  
  52. #
  53. # Global data used to create and cache demonstration
  54. #
  55.  
  56. surface_ = sphereSrf(1);
  57. dus_ = sphereSrf(1);
  58. dvs_ = sphereSrf(1);
  59. ns_  = sphereSrf(1);
  60. d2us_ = sphereSrf(1);
  61. d2vs_ = sphereSrf(1);
  62. duvs_ = sphereSrf(1);
  63. curve_ = circle(vector(0, 0, 0), 1);
  64. ccrv_ = circle(vector(0, 0, 0), 1);
  65. evol_ = circle(vector(0, 0, 0), 1);
  66. curveDomain_ = list(curve_);
  67. dusLine_ = curve_;
  68. dvsLine_ = curve_;
  69. nsLine_  = curve_;
  70.  
  71.  
  72. #
  73. # Demonstration export
  74. #
  75.  
  76. ShowSurfHodo = PROCEDURE(hodo, deriv):
  77.     showSurfDerivAtHodo = deriv:
  78.     showSurfHodo = hodo;
  79.  
  80. ShowSurfGeom = PROCEDURE(showDeriv, showCrvtr):
  81.     showSurfDerivAtPoint = showDeriv:
  82.     showSurfCrvtr = showCrvtr;
  83.  
  84. ShowCurvGeom = PROCEDURE(showDeriv, showCrvtr):
  85.     showCurvDeriv = showDeriv:
  86.     showCurvCrvtr = showCrvtr;
  87.  
  88. CreateSurfDemo = PROCEDURE(srf, crv): sqp:
  89.     surface_ = srf:
  90.     dus_ = sderive(srf, ROW):
  91.     dvs_ = sderive(srf, COL):
  92.     ns_  = snrmlsrf(srf):
  93.     d2us_ = sderive(dus_, ROW):
  94.     d2vs_ = sderive(dvs_, COL):
  95.     duvs_ = sderive(dus_, COL):
  96.     curve_ = creparam(coerce(crv, E2), 0, 1):
  97.     ccrv_ = compose(srf, curve_):
  98.     evol_ = creparam(evolute(ccrv_), 0, 1):
  99.     sqp = list(
  100.     vector(0, 0, 0),
  101.     vector(0, 1, 0),
  102.     vector(1, 1, 0),
  103.     vector(1, 0, 0)
  104.     ):
  105.     curveDomain_ = list(curve_, poly(sqp, false), sphereSrf(0.025)) * tz(-1.5):
  106.  
  107.     dusLine_ = compose(dus_, curve_):
  108.     dvsLine_ = compose(dvs_, curve_):
  109.     nsLine_  = compose(ns_,  curve_):
  110.  
  111.     color(surface_, srfMainColor):
  112.     color(curveDomain_, srfDomainColor):
  113.     color(ccrv_, srfCurveColor):
  114.     color(dus_, srfUparColor):
  115.     color(dvs_, srfVparColor):
  116.     color(ns_,  srfNormColor):
  117.     color(dusLine_, srfCurveColor):
  118.     color(dvsLine_, srfCurveColor):
  119.     color(nsLine_,  srfCurveColor);
  120.  
  121.  
  122. SurfAndHodoScene = FUNCTION():
  123.     return = nil():
  124.     if (showSurfMain, return = return + list(surface_, ccrv_)):
  125.     if (showSurfDomain, return = return + curveDomain_):
  126.     if (showSurfHodo,
  127.     return = return +
  128.             list(dus_, dvs_, ns_, dusLine_, dvsLine_, nsLine_, sphereSrf(0.025))*hodoMat_
  129.     );
  130.  
  131. #
  132. # Present curve in the surface geometry
  133. #
  134. GeomAtCurvPoint = FUNCTION(pt, t, nvec):
  135.     tang: evpt: radv: cr: cN: svec: Nn: Ns: pos: ncirc: gcirc: tline: nline:
  136.  
  137.     return = nil():
  138.     tang = ctangent(ccrv_, t):
  139.     evpt = ceval(evol_, t):
  140.     pos = coerce(pt, vector_type):
  141.     if (showCurvDeriv,
  142.         tline = pt + pt*trans(tang):
  143.         color(tline, crvTangColor):
  144.         snoc(tline, return):
  145.         nline = pt + evpt: # c(t) + N(t)/k(t)
  146.         color(nline, crvNormColor):
  147.         snoc(nline, return)
  148.     ):
  149.     if (showCurvCrvtr,
  150.         radv = coerce(evpt, vector_type) - pos:
  151.     cr = sqrt(radv*radv):        # 1/k(t)
  152.     if (abs(cr) > 1e-4,
  153.         cN = radv * (1 / cr):          # normalize N(t)/K(t)
  154.             svec = nvec ^ tang:
  155.             Nn = cN * nvec:
  156.             if (abs(Nn) > 1e-4,
  157.         ncirc = SurfOsculCircle(pos, cr / Nn, nvec, tang):
  158.         color(ncirc, crvNCrvtrColor):
  159.         snoc(ncirc, return)
  160.         ):
  161.             Ns = cN * svec:
  162.             if (abs(Ns) > 1e-4,
  163.         gcirc = SurfOsculCircle(pos, cr / Ns, svec, tang):
  164.         color(gcirc, crvGCrvtrColor):
  165.         snoc(gcirc, return)
  166.         )
  167.     )
  168.     );
  169.  
  170. GeomAtCurvParam = FUNCTION(t): dompt: nvec:
  171.     dompt = coerce(ceval(curve_, t), E2):
  172.     nvec = coerce(seval(ns_, coord(dompt, 1), coord(dompt, 2)), vector_type):
  173.     return = GeomAtCurvPoint(ceval(ccrv_, t), t, normalize(nvec));
  174.  
  175. #
  176. # Present surface geometry along some curve
  177. #
  178. GeomAtSurfPoint = FUNCTION(u, v):
  179.     srfpt: thumb: vdus: vdvs: vns: vplan: duspt: dvspt: nspt: nuv: circ1: circ2:
  180.     Aval: Bval: Dval: k1: k2: mk1f: mk2f: lk1e: lk2e: dn1: dn2: dir1: dir2:
  181.     E: F: G: L: N: M: u1: u2: v1: v2: pos: hdvs: hdus: hns:
  182.  
  183.     srfpt = seval(surface_, u, v):
  184.     pos   = coerce(srfpt, vector_type):
  185.     duspt = seval(dus_, u, v):
  186.     dvspt = seval(dvs_, u, v):
  187.     nspt  = seval(ns_,  u, v):
  188.  
  189.     thumb = SurfThumb(pos):
  190.     color(thumb, srfCurveColor):
  191.     return = list(thumb):
  192.  
  193.     if (showSurfDerivAtPoint,
  194.         vdus  = srfpt + duspt*trans(pos):
  195.         color(vdus, srfUparColor):
  196.         vdvs  = srfpt + dvspt*trans(pos):
  197.         color(vdvs, srfVparColor):
  198.         vns   = srfpt + nspt*trans(pos):
  199.         color(vns, srfNormColor):
  200.     vplan = SurfOsculPlane(pos, 0.15, coerce(nspt, vector_type), coerce(duspt, vector_type)):
  201.     color(vplan, srfNormColor):
  202.     return = return + list(vdus, vdvs, vns, vplan)
  203.     ):
  204.     if (showSurfDerivAtHodo,
  205.         hdus  = ctlpt(E3, 0, 0, 0) + duspt:
  206.         color(hdus, srfMainColor):
  207.         hdvs  = ctlpt(E3, 0, 0, 0) + dvspt:
  208.         color(hdvs, srfMainColor):
  209.         hns   = ctlpt(E3, 0, 0, 0) + nspt:
  210.         color(hns, srfMainColor):
  211.     return = return + list(hdus, hdvs, hns)*hodoMat_
  212.     ):
  213.  
  214.     if (showSurfCrvtr, 
  215.         duspt = coerce(duspt, vector_type):
  216.         dvspt = coerce(dvspt, vector_type):
  217.         nuv   = normalize(coerce(nspt,  vector_type)):
  218.         E = duspt*duspt:
  219.         F = duspt*dvspt:
  220.         G = dvspt*dvspt:
  221.         L = coerce(seval(d2us_, u, v), vector_type) * nuv:
  222.         M = coerce(seval(duvs_, u, v), vector_type) * nuv:
  223.     N = coerce(seval(d2vs_, u, v), vector_type) * nuv:
  224.     Aval = (E*G - F*F):
  225.     Bval = (G*L + E*N - 2*F*M) / (2*Aval):
  226.     Dval = sqrt(Bval*Bval - (L*N - M*M)/Aval):
  227.         k1 = Bval - Dval:
  228.         k2 = Bval + Dval:
  229.         mk1f = M - k1*F:
  230.         mk2f = M - k2*F:
  231.         lk1e = L - k1*E:
  232.         lk2e = L - k2*E:
  233.         dn1 = sqrt(mk1f*mk1f + lk1e*lk1e):
  234.         dn2 = sqrt(mk2f*mk2f + lk2e*lk2e):
  235.         if ((abs(dn1) > 1e-4),
  236.             u1 = mk1f / dn1: v1 = -lk1e / dn1,
  237.             if (abs(lk1e) < 1e-6, u1 = 1: v1 = 0, u1 = 0: v1 = 1)
  238.         ):
  239.         if ((abs(dn2) > 1e-4),
  240.             u2 = mk2f / dn2: v2 = -lk2e / dn2,
  241.             if (abs(lk2e) < 1e-6, u2 = 1: v2 = 0, u2 = 0: v2 = 1)
  242.         ):
  243.         dir1 = duspt*u1 + dvspt*v1:
  244.         dir2 = duspt*u2 + dvspt*v2:
  245.         if (abs(dir1*dir2) > 1e-4,
  246.         printf("At point %f %f \\n", list(u, v)):
  247.         printf("M:    %f F:    %f L:    %f E:    %f\\n", list(M, F, L, E)):
  248.         printf("mk1f: %f mk2f: %f lk1e: %f lk2e: %f\\n", list(mk1f, mk2f, lk1e, lk2e)):
  249.         printf("u1:   %f v1:   %f u2:   %f v2:   %f\\n", list(u1, v1, u2, v2))
  250.         ):
  251.  
  252.     if (abs(k1) > 1e-4,
  253.             circ1 = SurfOsculCircle(pos, 1/k1, nuv, dir1):
  254.             color(circ1, srfCrvtrColor):
  255.         snoc(circ1, return)
  256.         ):
  257.         if (abs(k2) > 1e-4,
  258.             circ2 = SurfOsculCircle(pos, 1/k2, nuv, dir2):
  259.             color(circ2, srfCrvtrColor):
  260.         snoc(circ2, return)
  261.     )
  262.     );
  263.  
  264.  
  265. GeomAtParam = FUNCTION(t): dompt:
  266.     dompt = coerce(ceval(curve_, t), E2):
  267.     return = GeomAtSurfPoint(coord(dompt, 1), coord(dompt, 2));
  268.